App.ProjectuserDlgSelect = function(config){
	// スーパークラスコンストラクタ呼び出し
	App.ProjectuserDlgSelect.superclass.constructor.call(this, config);
} ;

// App.ModalDialogを継承
Ext.extend(App.ProjectuserDlgSelect, App.ModalDialog, {
    //=============================
    // メンバー
    //=============================
    // オーバーライドメンバー
	width          :400,                   // ダイアログ幅
	height         :'auto',                   // ダイアログ高さ
	container      :"dlg_pru_select",      // コンテナエレメントのID

    // 独自メンバー
    elm_grid        : null,
	center_panel 	: null,
    data_model      : null,
    select_single   : false,
    select_multi    : true,
    single_row_index: null,
    select_multi_indexies : new Array(),
    fields          : new Array(),
    multi_check_image : null,
    multi_checked_image : null,
    single_check_image : null,
    single_checked_image : null,
    single_disabled_image : null,
    button_select   : null,

    /*
     * 関数名：onDocLoaded
     * 概　要：ドキュメント読込完了イベント。
     *         該当ダイアログ内のエレメントに対し、イベント設定を行う
     * 引　数：なし
     * 戻り値：なし
     */
    onDocLoaded : function(){
        // 画像先読み
        this.multi_check_image          = new Image();
        this.multi_check_image.src      = url_for("/images/icon_check_checkbox.gif") ;
        this.multi_checked_image        = new Image();
        this.multi_checked_image.src    = url_for("/images/icon_checked_checkbox.gif") ;
        this.single_check_image         = new Image();
        this.single_check_image.src     = url_for("/images/icon_check_radio.gif") ;
        this.single_checked_image       = new Image();
        this.single_checked_image.src   = url_for("/images/icon_checked_radio.gif") ;
        this.single_disabled_image      = new Image();
        this.single_disabled_image.src  = url_for("/images/icon_check_radio_disabled.gif") ;
    
    
	    // 保存ボタンクリックイベント設定
		elm = Ext.get('dlg_pru_select_select') ;
		elm.on('click', this.onSelect, this, true) ;
	    // 閉じるボタンクリックイベント設定
		elm = Ext.get('dlg_pru_select_close') ;
		elm.on('click', this.onClose, this, true) ;

	},

	/*==================================================
	 * 関数名：fncCreateCenterLayout
	 * 概　要：当該ページの中央エリアレイアウトを生成する
	 * 引　数：なし
	 * 戻り値：なし
	 ==================================================*/
	fncCreateCenterLayout : function(){
		var elmmain = Ext.get( 'dlg_pru_list_panel') ;
		this.center_panel = new Ext.Container({
			applyTo : elmmain,
			layout : 'border',
			monitorResize : true,
			border : true,
			items: [
				this.elm_grid
			]
		}) ;
	},

	fncInitGrid : function(){
	    //-----------------------------
        // パラメータ取得
	    //-----------------------------
        // 選択タイプ
        var select_multi   = this.dataparam['select_multi'] ;
        this.select_multi = select_multi == null ? true : select_multi ;
        var select_single  = this.dataparam['select_single'] ;
        this.select_single = select_single == null ? false : select_single ;
        if( !this.select_multi && !this.select_single ) this.select_single = true ;

	    //-----------------------------
        // カラムモデル生成
	    //-----------------------------
	    // ソート情報
//        var sort = Ext.grid.ColumnModel.sortTypes;
        // カラム情報
        var cols = new Array() ;
        this.fields = new Array() ;
        if( this.select_multi ){
            // マルチ選択の場合は、チェックボックスを表示
            var col = {
                header:     app_localized_message("label", "charge_user"),
                width:      50,
                sortable:   false,
                renderer:   this.formatMultiBoolean,
                dataIndex:"select_multi",
                align:"center"
            } ;
            cols.push( col ) ;
            this.fields.push( {name:"select_multi", mapping:"select_multi"} ) ;
            
        }
        // ユーザー名称
        var col = {
            header:     app_localized_message("label", "part_members"),
            width:      100,
            sortable:   true,
            id:"user_name",
            dataIndex:"user_name"
        } ;
        cols.push( col ) ;
        this.fields.push({name:"user_name", mapping:"user_name"}) ;

        if( this.select_multi ){
            // シングル選択も指定の場合は、ラジオボタンを表示
            if( this.select_single ){
                var col = {
                    header:     app_localized_message("label", "main_user"),
                    width:      50,
                    sortable:   false,
                    renderer:   this.formatSingleBoolean,
                    dataIndex:"select_single",
                    align:"center"
                } ;
                cols.push( col ) ;
                this.fields.push( {name:"select_single", mapping:"select_single"} ) ;
            }
        }

        this.fields.push({name:"projectuser_id", mapping:"projectuser_id"}) ;
        
        // カラムモデル生成        
//        var col_model = new Ext.grid.ColumnModel(cols);

	    //-----------------------------
        // データストア生成
	    //-----------------------------
        this.data_model = new Ext.data.JsonStore({
            root: "projectusers",
		    fields:this.fields
        });

	    //-----------------------------
        // グリッド生成
	    //-----------------------------
//    	this.elm_grid = new Ext.grid.Grid('dlg_pru_select_grid', {ds:this.data_model, cm:col_model, autoExpandColumn: 'user_name'});
		this.elm_grid = new Ext.grid.GridPanel({
			el : 'dlg_pru_select_grid',
			ds: this.data_model,
			columns : cols,
			stripeRows: true,
			autoExpandColumn: 'user_name',
			loadMask : true,
			region: 'center',
			margins: '0 0 0 0'
		});

//   		this.elm_grid.render();
   		this.elm_grid.addListener("cellclick", this.onCellClick, this, true) ;

	},

	/*==================================================
	 * 関数名：onShow
	 * 概　要：ダイアログ表示イベント
	 * 引　数：dlg						Ext.BasicDialog		   ダイアログオブジェクト
	 * 戻り値：なし
	 ==================================================*/
	onShow : function ( dlg ){
		// ※100%幅高さ定義しているため、実際にダイアログを表示したあとでないと、サイズが不明。
		// 　　onShow時に強制的に再レイアウト
		this.center_panel.doLayout() ;
	},

	onCellClick : function(grid, rowIndex, columnIndex, e){
        var ds = grid.getStore() ;
        var rec = ds.getAt(rowIndex) ;
        if( this.select_multi ){
            if(  columnIndex == 0 ){
                if( rec.get("select_multi") ){
                    rec.set("select_multi", false) ;
                    this.select_multi_indexies = this.select_multi_indexies.without(rowIndex) ;
                    if( this.select_single ){
                        rec.set("select_single", false ) ;

                        if( this.single_row_index == rowIndex ){
                            var new_single_index = null ;
                            for( var i=0 ; i<this.select_multi_indexies.length ; i++ ){
                                if( new_single_index == null || this.select_multi_indexies[i] < new_single_index ){
                                    new_single_index = this.select_multi_indexies[i] ;
                                }
                            }
                            if( new_single_index == null ){
                                this.single_row_index = null ;
                            }
                            else{
                                var newrec = ds.getAt(new_single_index) ;
                                newrec.set("select_single", true ) ;
                                this.single_row_index = new_single_index ;
                            }
                        }
                    }
                }
                else{
                    rec.set("select_multi", true ) ;
                    if( this.select_multi_indexies.indexOf(rowIndex) < 0 ){
                        this.select_multi_indexies.push( rowIndex ) ;
                    }

                    if( this.select_single ){
                        if( this.select_multi_indexies.length == 1 ){
                            rec.set("select_single", true ) ;
                            this.single_row_index = rowIndex ;
                        }
                        else{
                            rec.set("select_single", false ) ;
                        }
                    }
                }
            }
            else if( this.select_single ){
                if(  columnIndex == 2 && rec.get("select_multi") ){
                    if( this.single_row_index != null ){
                        ds.getAt(this.single_row_index).set("select_single", false ) ;
                    }
                    rec.set("select_single", true ) ;
                    this.single_row_index = rowIndex ;
                }
            }
        }
	},
	
	formatMultiBoolean : function(value, p, r){
        var ret = value ? '<img src="' + App.Page.thispage.dialogs.ProjectuserDlgSelect.multi_checked_image.src + '">' : '<img src="' + App.Page.thispage.dialogs.ProjectuserDlgSelect.multi_check_image.src + '">';  
//        return '<div style="text-align:center;">' + ret + '</div>' ;
        return ret ;
	},

	formatSingleBoolean : function(value, p, r){
        var ret = !r.data.select_multi ? '<img src="' + App.Page.thispage.dialogs.ProjectuserDlgSelect.single_disabled_image.src + '">' : value ? '<img src="' + App.Page.thispage.dialogs.ProjectuserDlgSelect.single_checked_image.src + '">' : '<img src="' + App.Page.thispage.dialogs.ProjectuserDlgSelect.single_check_image.src + '">'  ;  
//        return '<div style="text-align:center;">' + ret + '</div>' ;
        return ret ;
	},
	
	
    /*
     * 関数名：onSelect
     * 概　要：選択ボタンクリックイベント。
     *         フォームの選択状態を呼び出し元に通知する
     * 引　数：なし
     * 戻り値：なし
     */
	onSelect : function(){
	   this.button_select = "select" ;
	   this.dialog.hide() ;
	   // コールバック関数呼び出し
        this.fncExecCallback("on_select");
	},

    /*
     * 関数名：onClose
     * 概　要：閉じるボタンクリックイベント
     *         ダイアログを閉じる。
     * 引　数：なし
     * 戻り値：なし
     */
	onClose : function(){
	   this.button_select = "close" ;
	   this.dialog.hide() ;
	   // コールバック関数呼び出し
        this.fncExecCallback("on_close");
	},
	
    /*
     * 関数名：onHide
     * 概　要：ダイアログ非表示イベント
     * 引　数：dlg                        YAHOO.ext.BasicDialog    ダイアログオブジェクト
     * 戻り値：なし
     */
    onHide : function ( dlg ){
        if( this.button_select == null ){
            this.fncExecCallback("on_close");
        }
    },

    /*
     * 関数名：fncReset
     * 概　要：ダイアログ内容をリセットする
     * 引　数：なし
     * 戻り値：なし
     */
    fncReset: function()
    {
        this.button_select = null ;
        this.fncInitGrid() ;
        this.fncCreateCenterLayout() ;
        this.fncDataLoad() ;
    },

    /*
     * 関数名：fncDataRead
     * 概　要：パラメータの内容で、データを読み込む
     * 引　数：なし
     * 戻り値：なし
     */
    fncDataLoad: function()
    {
	    // プロジェクトユーザーオブジェクト
        var initialdata     = this.dataparam['initialdata'] ;
        if(initialdata != null){
            for( var index=0 ; index<initialdata["projectusers"].length ; index++ ){
                if( initialdata["projectusers"][index].select_single ){
                    this.single_row_index = index ;
                }
                
                if( initialdata["projectusers"][index].select_multi){
                    this.select_multi_indexies.push( index ) ;
                }
            }
            this.data_model.loadData(initialdata) ;
        }
    },
    
    fncGetProjectUsersSize : function(){
        return this.data_model.getCount() ;
    },
    
    fncGetProjectUserAttribute : function(rowindex, name){
        var row = this.data_model.getAt(rowindex) ;
        if( row == null ) return null;
        
        switch( name ){
            case 'select_multi' :
            case 'select_single' :
            case 'user_name' :
            case 'projectuser_id' :
                var ret = row.get(name) ;
                return ret ;
                break ;
            default :
                return null ;
                break ;
        }
    }

});
//=============================
// 現在のページオブジェクトのdialogsメンバーに設定
//=============================
App.Page.thispage.dialogs.ProjectuserDlgSelect = new App.ProjectuserDlgSelect() ;
